#include <bits/stdc++.h>
using namespace std;

bool dfs(int v, vector <vector <int> > &g, vector <int> &p, vector <bool> &u) {
	u[v] = 1;
	for (auto to: g[v]) {
		if (p[to] == -1) {
			p[to] = v;
			return 1;
		}
		if (u[p[to]]) {
			continue;
		}
		if (dfs(p[to], g, p, u)) {
			p[to] = v;
			return 1;
		}
	}
	return 0;
}

int main() {
	int n, m;
	cin >> n >> m;
	vector <string> a(n);
	for (int i = 0; i < n; ++i) {
		cin >> a[i];
	}
	vector <vector <int> > b(n, vector <int>(m, -1));
	int left = 0, right = 0;
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < m; ++j) {
			if (a[i][j] == '#') {
				if ((i + j) % 2) {
					b[i][j] = left++;
				} else {
					b[i][j] = right++;
				}
			}
		}
	}
	if (left != right) {
		cout << "No" << endl;
		return 0;
	}
	vector <vector <int> > g(left);
	int dx[4] = {1, 0, -1, 0};
	int dy[4] = {0, 1, 0, -1};
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < m; ++j) {
			if (a[i][j] == '#' && (i + j) % 2 == 1) {
				for (int d = 0; d < 4; ++d) {
					if (i + dx[d] >= 0 && i + dx[d] < n && j + dy[d] >= 0 && j + dy[d] < m && b[i + dx[d]][j + dy[d]] >= 0) {
						g[b[i][j]].push_back(b[i + dx[d]][j + dy[d]]);
					}
				}
			}
		}
	}
	vector <int> p(right, -1);
	vector <bool> s(left), u(left);
	for (int i = 0; i < left; ++i) {
		for (auto to: g[i]) {
			if (p[to] == -1) {
				p[to] = i;
				s[i] = 1;
				break;
			}
		}
	}
	for (int i = 0; i < left; ++i) {
		if (!s[i]) {
			u.assign(n, 0);
			s[i] = dfs(i, g, p, u);
		}
	}
	for (int i = 0; i < left; ++i) {
		if (!s[i]) {
			cout << "No";
			return 0;
		}
	}
	cout << "Yes";
	return 0;
}